home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / answrbok / 5_5.lha / 5_5 / 5_5E.h < prev    next >
C/C++ Source or Header  |  1993-08-08  |  2KB  |  143 lines

  1. * Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
  2. * The C++ Answer Book */
  3. * Tony Hansen */
  4. * All rights reserved. */
  5. truct tree
  6.  
  7.    tree() { }
  8.    virtual ~tree() { }
  9.    virtual int eval() { return 0; }
  10.    virtual void print() { }
  11. ;
  12.  
  13. truct unary_op : tree
  14.  
  15.    tree *left;
  16.    unary_op() { left = 0; }
  17.    ~unary_op() { delete left; }
  18. ;
  19.  
  20. truct binary_op : unary_op
  21.  
  22.    tree *right;
  23.    binary_op() { right = 0; }
  24.    ~binary_op() { delete right; }
  25. ;
  26.  
  27. truct number_leaf : tree
  28.  
  29.    int value;
  30.    number_leaf(int v) { value = v; }
  31.    int eval() { return value; }
  32.    void print() { cout << "( " << value << " ) "; }
  33. ;
  34.  
  35. truct plus_op : binary_op
  36.  
  37.    int eval()
  38.    { return left->eval() + right->eval(); }
  39.  
  40.    void print()
  41.    {
  42. cout << "( ";
  43. left->print();
  44. cout << "+ ";
  45. right->print();
  46. cout << ") ";
  47.    }
  48. ;
  49.  
  50. truct unary_minus_op : unary_op
  51.  
  52.    int eval()
  53.    { return - left->eval(); }
  54.  
  55.    void print()
  56.    {
  57. cout << "( - ";
  58. left->print();
  59.    }
  60. ;
  61.  
  62. truct binary_minus_op : binary_op
  63.  
  64.    int eval()
  65.    { return left->eval() - right->eval(); }
  66.  
  67.    void print()
  68.    {
  69. cout << "( ";
  70. left->print();
  71. cout << "- ";
  72. right->print();
  73. cout << ") ";
  74.    }
  75. ;
  76.  
  77. truct mult_op : binary_op
  78.  
  79.    int eval()
  80.    { return left->eval() * right->eval(); }
  81.  
  82.    void print()
  83.    {
  84. cout << "( ";
  85. left->print();
  86. cout << "* ";
  87. right->print();
  88. cout << ") ";
  89.    }
  90. ;
  91.  
  92. truct div_op : binary_op
  93.  
  94.    int eval()
  95.    {
  96. int l = left->eval();
  97. int r = right->eval();
  98. return (r != 0) ?
  99.        (l / r) :
  100.        error("division by 0");
  101.    }
  102.  
  103.    void print()
  104.    {
  105. cout << "( ";
  106. left->print();
  107. cout << "/ ";
  108. right->print();
  109. cout << ") ";
  110.    }
  111. ;
  112.  
  113. truct lparen_op : unary_op
  114.  
  115.    int eval()
  116.    { return left->eval(); }
  117.  
  118.    void print()
  119.    {
  120. cout << "( ";
  121. left->print();
  122. cout << ") ";
  123.    }
  124. ;
  125.  
  126. lass expr
  127.  
  128.    tree *head;
  129.    int evaluated, value;
  130.  
  131. ublic:
  132.    expr(char*);
  133.    ~expr() { delete head; }
  134.    int eval();
  135.    void print();
  136. ;
  137.  
  138. truct token
  139.  
  140.    exprtype type;
  141.    int value;
  142. ;
  143.